/*                          UX-Framework                               
 *                                                                 
 *  iZE Co.,Ltd. Copyright 2009 All rights reserved.          
 *  This file is distributed under the terms of the GNU Lesser 
 *  General Public License, described in file LICENSE.                                     
 */
package jp.ize.ux;

import jp.ize.ux.UXInteraction;

/**
 * UXControllerクラス<br>
 * ユーザーの操作イベントを発生させる対象と相互作用であるUXInteractionを結びつける、UX-Frameworkの根幹を成す
 * クラス(の一つ)です。
 * UXInteractionsを、識別名がキーとなるHashで管理し、それぞれのUXInteractionが指定するイベントを受け取って、
 * UXInteractionのdoWorkを実行します。<br>
 *
 * @author		iZE Co., Ltd.<br>
 * @version		$Id$<br>
 */
class UXController<S> extends UXContainer
{
	// {{{ properties

	//プライベート変数
	var _cmds : Hash<UXInteraction<S>>;
 	var _state : S;

	// }}}
	// {{{ public function new()
	/**
	 * コンストラクタ。
	 */
	public function new( s : S )
	{
		super();
 		_state = s;
		_cmds = new Hash();
	}
	// }}}
	// {{{ public function addInteraction( inter : UXInteraction<S> ) : Void
	/**
	 * 新しくインタラクションを追加します。
	 * 管理しているすべての子UXObjectに対して、指定されたインタラクションが起こるリスナーを追加します。
	 */
	public function addInteraction( inter : UXInteraction<S> ) : Void
	{
		//just sample
		_cmds.set(inter.name, inter);
		for(event in inter.getEvents()) {
			for (c in _children) {
				c.addEventListener(event, receive);
			}
		}

	}
	// }}}
	// {{{ public function removeInteraction( inter : UXInteraction<S> ) : Void
	/**
	 * インタラクションを削除します。
	 * 管理しているすべての子UXObjectに対して、指定されたインタラクションを解除します。
	 */
	public function removeInteraction( inter : UXInteraction<S> ) : Void
	{
	}
	// }}}
	// {{{ public function replaceInteraction( intername : String, inter : UXInteraction<S> ) : Void
	/**
	 * 識別名intername を持つインタラクションを指定されたものに置き換えます。
	 */
	public function replaceInteraction( intername : String, inter : UXInteraction<S> ) : Void
	{
	}
	// }}}
	// {{{ public function getInteraction( intername : String ) : UXInteraction<S>
	/**
	 * 識別名internameを持つインタラクションを返します。
	 * 存在しなかった場合はnullを返します。
	 */
	public function getInteraction( intername : String ) : UXInteraction<S>
	{
		return _cmds.get(intername);
	}
	// }}}
	// {{{ public function addChild( c : UXObject ) : Void
	/**
	 * 指定されたUXObjectを管理下に追加します。Hashに登録されているすべてのインタラクションが指定された
	 * UXObjectに登録されます。
	 */
	public override function addChild( c : UXObject ) : Void
	{
		//just sample.
		super.addChild(c);
		var me = this;
		for (cmd in _cmds) {
			for(ev in cmd.getEvents()) {
				c.addEventListener(ev,
								   function(e:UXEvent)
								   return me.receive(new UXMouseEvent(e.name, null, null, null)));
				
			}
		}
		
	}
	// }}}
	// {{{ public function removeChild( c : UXObject ) : Void
	/**
	 * 指定されたUXObjectを管理から外します。指定されたUXObjectのイベントリスナーを解除してします。
	 */
	public override function removeChild( c : UXObject ) : Void
	{
	}
	// }}}
	// {{{ private function event2param( event : UXEvent ) {

	// just sample.
	private function event2param( event : UXEvent ) {
		return switch event.name {
				case UXMouseEvent.DOWN :
					Mouse( cast( event ) );
				default:
					// just just sample.
					Mouse( cast( event ) );
			}
	}

	// }}}
	// {{{ private function receive( event : UXEvent )

	// just sample.
	private function receive( event : UXEvent )
	{
		for( c in _cmds ) {
			for ( e in c.getEvents()) {
				if (e == event.name) {
					c.doWork(_state, event2param( event ) );
				}
			}
		}
	}

	// }}}
}
